/**
 * 匿名函数通过编译器，可以捕获上下文中的变量，并使用这些变量。
 * 并根据使用的方式，可以有三种：不可变引用、可变引用和夺权。
 * 
 * 可变应用的时候，在定义的时候就已经是可变引用了,且没有归还。这个需要特别注意。
 * 所以必须调用匿名函数前，不能使用该变量。
 * 
 */
use std::thread;
/**
 * 不可变引用演示
 */
fn immutable_ref() {
   let books = vec!["数学", "汉语","诗歌","物理"];
   let only_borrow=|| println!("使用匿名函数时候....：{books:?}");
   //println! 模式是不可变引用
   println!("使用匿名函数前：{books:?}");
   only_borrow();
   println!("使用匿名函数后：{books:?}");
}
/**
 * 可变引用演示
 */
fn mutable_ref() {
    let mut books = vec!["数学", "汉语","诗歌","物理"];
    println!("定义匿名函数前：{books:?}");
    let mut borrows_mutably =|| books.push("哲学");     //在定义的时候，就已经是可变引用了,且没有归还
    //println!("使用匿名函数前：{books:?}"); //这个会报错，因为可变引用执行的时候，books 已经不可用了: immutable borrow occurs here
                                            //但是需要注意的是  ，仅仅是匿名函数才会造成这种情况 
    //let x=&mut books;                                  // cannot borrow `books` as mutable more than once at a time                                
    borrows_mutably ();
    println!("使用匿名函数后：{books:?}");  //这里又可以，是因为借用后又归还了。
}
/**
 * 夺权演示(move)
 */
fn take_ownership() {
    let books = vec!["数学", "汉语","诗歌","物理"];
    println!("使用匿名函数前：{books:?}");
    // move 关键字，将 books 的所有全给闭包
    thread::spawn(move || println!("From thread: {books:?}"))
        .join()
        .unwrap();
    //所以这里应该会编译错误的
    //println!("使用匿名函数后：{books:?}");   //这个会报错，因为所有权已经被转移了
}

fn main(){
  mut_borrow();
}

fn  mut_borrow() {
    let mut c:u32=20;
    let c1=&mut c;
    let mut age:u32=10;
    let a=&mut age;
    *a=*a+10; //这个语法够怪异的。
    println!("{}",age);

    //现在再做不可变借用
    let b=&age;
    println!("{}",age);
}


